www.gusucode.com > VC++ 模仿MSN界面 > VC++ 模仿MSN界面/gusucode/MSN/UserList.cpp

    //Download by http://www.NewXing.com
// UserList.cpp : implementation file
//

#include "stdafx.h"
#include "MSN.h"
#include "UserList.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CUserList dialog


CUserList::CUserList(CWnd* pParent /*=NULL*/)
	: CDialog(CUserList::IDD, pParent)
{
	//{{AFX_DATA_INIT(CUserList)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}

CUserList::~CUserList()
{
	for(std::vector<CUserChat*>::iterator it = arr_chat.begin(); it!= arr_chat.end(); ++it)
		delete *it;
	arr_chat.clear();
}

void CUserList::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CUserList)
	DDX_Control(pDX, IDC_EDIT16, m_search);
	DDX_Control(pDX, IDC_TREE1, m_UserTree);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CUserList, CDialog)
	//{{AFX_MSG_MAP(CUserList)
	ON_NOTIFY(NM_CLICK, IDC_TREE1, OnClickTree1)
	ON_WM_PAINT()
	ON_WM_ERASEBKGND()
	ON_WM_SIZE()
	ON_MESSAGE(WM_USER_EDITBUTTON_CLICKED,OnEditButtonClicked)
	ON_NOTIFY(NM_DBLCLK, IDC_TREE1, OnDblclkTree1)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CUserList message handlers

void CUserList::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	CRect rc;
	GetClientRect(rc);
	RECT   rcCtrl = {0};   
	CWnd*  pwndCtrl = GetWindow(GW_CHILD);   
	while(pwndCtrl)   
	{   
		if(IsWindow(pwndCtrl->m_hWnd)&&pwndCtrl->IsWindowVisible())   
		{   
			pwndCtrl->GetWindowRect(&rcCtrl);   
			ScreenToClient(&rcCtrl); 
			dc.ExcludeClipRect(&rcCtrl);   
		}   
		pwndCtrl = pwndCtrl->GetNextWindow();   
	}   

	dc.FillSolidRect(rc, 0xffffff);
	dc.Draw3dRect(rc, 0xffc0a2,0xffc0a2);
	CPen pen;
	pen.CreatePen(PS_SOLID,1,0xf3eae2);
	dc.SelectObject(pen);
	dc.MoveTo(0,36);
	dc.LineTo(rc.Width(), 36);
}

BOOL CUserList::OnEraseBkgnd(CDC* pDC) 
{
	return TRUE;
	return CDialog::OnEraseBkgnd(pDC);
}

BOOL CUserList::OnInitDialog() 
{
	CDialog::OnInitDialog();

	//SetWindowNoSkinHwnd(m_hWnd, FALSE);

	CRect rc;
	GetClientRect(rc);	
	CButton *btn = (CButton *)GetDlgItem(3000);
	btn->MoveWindow(rc.right-52, 7, 22, 22);

	CTreeCtrl *m_ctrlTree = (CTreeCtrl *)GetDlgItem(IDC_TREE1);
	rc.InflateRect(1, 37,1,-37);
	m_ctrlTree->MoveWindow(rc);

	m_ILtabItem.Create(16, 16, ILC_MASK | ILC_COLOR32, 1, 1);
	ImageList_AddIcon(m_ILtabItem.m_hImageList, AfxGetApp()->LoadIcon(IDI_Collapse));
	ImageList_AddIcon(m_ILtabItem.m_hImageList, AfxGetApp()->LoadIcon(IDI_Expand));
	ImageList_AddIcon(m_ILtabItem.m_hImageList, AfxGetApp()->LoadIcon(IDI_Collapse1));
	ImageList_AddIcon(m_ILtabItem.m_hImageList, AfxGetApp()->LoadIcon(IDI_Expand1));	
	m_ctrlTree->SetImageList(&m_ILtabItem,TVSIL_STATE);   //   设置图标链标   

	static HTREEITEM hParent=TVI_ROOT;
	hParent=m_ctrlTree->InsertItem(TVIF_TEXT|TVIF_STATE|TVIF_PARAM, "其他联系人(5/5)", 0, 1, INDEXTOSTATEIMAGEMASK(1), TVIS_STATEIMAGEMASK, 1, TVI_ROOT, TVI_LAST);   
	m_ctrlTree->EnsureVisible(hParent);
	m_ctrlTree->InsertItem("连讪讪",hParent);
	m_ctrlTree->InsertItem("王非",hParent);
	m_ctrlTree->InsertItem("徐静雷",hParent);
	m_ctrlTree->InsertItem("周杰论",hParent);
	m_ctrlTree->InsertItem("刘德华",hParent);	

	hParent=m_ctrlTree->InsertItem(TVIF_TEXT|TVIF_STATE|TVIF_PARAM, "skinfeature公司(5/5)", 0, 1, INDEXTOSTATEIMAGEMASK(1), TVIS_STATEIMAGEMASK, 1, TVI_ROOT, TVI_LAST);   
	m_ctrlTree->EnsureVisible(hParent);
	m_ctrlTree->InsertItem("产品中心",hParent);
	m_ctrlTree->InsertItem("技术中心",hParent);
	m_ctrlTree->InsertItem("售后服务",hParent);
	m_ctrlTree->InsertItem("销售部门",hParent);
	m_ctrlTree->InsertItem("深圳分公司",hParent);
	m_ctrlTree->Expand(hParent, TVE_EXPAND);

	hParent=m_ctrlTree->InsertItem(TVIF_TEXT|TVIF_STATE|TVIF_PARAM, "非即时消息联系人(2/12)", 0, 1, INDEXTOSTATEIMAGEMASK(1), TVIS_STATEIMAGEMASK, 1, TVI_ROOT, TVI_LAST);   
	
	m_ctrlTree->InsertItem("坏到刚刚好",hParent);
	m_ctrlTree->InsertItem("文江",hParent);
	m_ctrlTree->InsertItem("三国贾许",hParent);
	m_ctrlTree->InsertItem("改变习惯",hParent);
	m_ctrlTree->InsertItem("努力没有什么不可以",hParent);
	m_ctrlTree->Expand(hParent, TVE_EXPAND);
	
	hParent=m_ctrlTree->InsertItem(TVIF_TEXT|TVIF_STATE|TVIF_PARAM, "黑名单用户(1/25)", 0, 1, INDEXTOSTATEIMAGEMASK(1), TVIS_STATEIMAGEMASK, 1, TVI_ROOT, TVI_LAST);   
	
	m_ctrlTree->InsertItem("冰冻的心",hParent);
	m_ctrlTree->InsertItem("夏天的冰块",hParent);
	m_ctrlTree->InsertItem("僧人boy",hParent);
	m_ctrlTree->InsertItem("孤单生活",hParent);
	m_ctrlTree->InsertItem("爱我就离开我",hParent);

	::SendMessage(m_UserTree.m_hWnd, TVM_SETITEMHEIGHT, 20, 0);
	m_UserTree.ModifyStyle(0, 0x8000);   

	CRect rcEditArea(20,4,125,17);
	m_search.SetEditArea(rcEditArea);
	CRect rcButtonArea(128,3,143,18);
	m_search.SetButtonArea(rcButtonArea);
	m_search.SetOwner(this);
	m_search.SetButtonClickedMessageId(WM_USER_EDITBUTTON_CLICKED);
	m_search.SetButtonExistsAlways(FALSE);
	m_search.SetBitmaps("bitmap1.bmp", "bitmap_e.bmp");
	
	CEdit *edit =  (CEdit *)GetDlgItem(IDC_EDIT16);
	edit->MoveWindow(7, 7, rc.Width()-7-59, 22);
	
	return TRUE; 
	
}

void CUserList::OnSize(UINT nType, int cx, int cy) 
{
	CTreeCtrl *m_ctrlTree = (CTreeCtrl *)GetDlgItem(IDC_TREE1);
	m_ctrlTree->MoveWindow(1,37,cx-2,cy-38);

	CButton *btn = (CButton *)GetDlgItem(3000);
	btn->MoveWindow( cx -52, 7, 22, 22);

	CEdit *edit =  (CEdit *)GetDlgItem(IDC_EDIT16);
	edit->MoveWindow(7, 2, cx-2-59, 32);

	CDialog::OnSize(nType, cx, cy);

}

void CUserList::OnClickTree1(NMHDR* pNMHDR, LRESULT* pResult) 
{
	*pResult = 0;
	
	HTREEITEM hTreeSelectedItem = GetTreeItemFromPoint();
	
	if (hTreeSelectedItem == NULL)
		return;

	if (m_UserTree.GetChildItem(hTreeSelectedItem) == NULL)
		return;

	UINT nState = m_UserTree.GetItemState(hTreeSelectedItem, TVIS_EXPANDED);   
	if(0 != (nState&TVIS_EXPANDED))   
	{   
		m_UserTree.SetItemState(hTreeSelectedItem,INDEXTOSTATEIMAGEMASK(TVE_COLLAPSE),TVIS_STATEIMAGEMASK); 
		m_UserTree.SendMessage(TVM_EXPAND, (WPARAM)(UINT)(TVE_COLLAPSE|TVE_EXPANDPARTIAL),(LPARAM)(HTREEITEM)hTreeSelectedItem);   
	}   
	else   
	{   
		m_UserTree.SetItemState(hTreeSelectedItem,INDEXTOSTATEIMAGEMASK(TVM_EXPAND),TVIS_STATEIMAGEMASK); 
		m_UserTree.SendMessage(TVM_EXPAND, (WPARAM)(UINT)(TVE_EXPAND|TVE_EXPANDPARTIAL),(LPARAM)(HTREEITEM)hTreeSelectedItem);   		
	}
	m_UserTree.Invalidate();
}

HTREEITEM CUserList::GetTreeItemFromPoint()
{
	CPoint ptNew;
	::GetCursorPos(&ptNew);
	CPoint ptClient(ptNew);
	m_UserTree.ScreenToClient(&ptClient);
	HTREEITEM hTreeItem = m_UserTree.HitTest(ptClient);
	
	return hTreeItem;
}

LRESULT CUserList::OnEditButtonClicked(WPARAM wParam, LPARAM lParam)
{
	//clear edit control
	m_search.SetWindowText(_T(""));
	AfxMessageBox("d");
	return 1;
}

void CUserList::OnDblclkTree1(NMHDR* pNMHDR, LRESULT* pResult) 
{
	HTREEITEM hItem = m_UserTree.GetSelectedItem();
	//chatInfoTip.ShowWindow(SW_HIDE);
	if (m_UserTree.GetParentItem(hItem)!=NULL)
	{
		CUserChat *main = new CUserChat();
		main->CreateDlg(MAKEINTRESOURCE(IDD_CHAT),NULL);
		main->SetWindowPos(&CWnd::wndNoTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
		main->ShowWindow(SW_NORMAL);
		arr_chat.push_back(main);
		*pResult = 0;
	}
	*pResult = 0;
}